package com.arcticcoding.controlphone;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

import com.arcticcoding.controlphone.Network.MovementMessage;
import com.arcticcoding.controlphone.Network.RegisterName;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Die Klasse LaunchActivity enthaelt die erste Activity, die beim Start
 * angezeigt wird. Hier wird die Verbindung vom Client zum Server aufgebaut und
 * die ControlActivity gestartet.
 * 
 * @author Steffen Zuber, Daniel Horbach
 * 
 */
public class LaunchActivity extends Activity {

	private Button bConnect;
	private EditText editIP;

	private WifiManager wifiManager;
	protected static String ip;
	protected static Client client;
	private String name;

	private TextView battery;

	public static final String CLIENT_NAME = "ControlPhone";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_launch);

		battery = (TextView) findViewById(R.id.textViewBattery);

		// Der Client wird erzeugt und gestartet. Dann wir er in der
		// Network-Klasse registriert.
		client = new Client();
		client.start();
		Network.register(client);

		// Dem Client wir ein Listener hinzugefuegt. Dieser legt fest, wie auf
		// die Ereignisse connected,
		// received und disconnected reagiert werden soll.
		client.addListener(new Listener() {
			// Der Client hat eine Verbindung zum Server aufgebaut
			public void connected(Connection connection) {
				RegisterName registerName = new RegisterName();
				registerName.name = name;
				client.sendTCP(registerName);
			}

			// Der Client hat ein Object erhalten
			public void received(Connection connection, Object object) {
				if (object instanceof MovementMessage) {
					MovementMessage movementMessage = (MovementMessage) object;
					final String msg = movementMessage.text;
					if (msg.contains("marvin")) {
						final String[] bat = msg.split(";");
						if (bat.length == 3 && bat[1].equals("b")) {
							LaunchActivity.this.runOnUiThread(new Runnable() {
								public void run() {
									battery.setText("Batterie: " + bat[2]);
								}
							});
						}
					} else {
						LaunchActivity.this.runOnUiThread(new Runnable() {
							public void run() {
								Toast.makeText(LaunchActivity.this, msg,
										Toast.LENGTH_LONG).show();
							}
						});
					}
				}
			}

			// Die Verbindung zum Server wurde getrennt
			public void disconnected(Connection connection) {
				LaunchActivity.this.runOnUiThread(new Runnable() {
					public void run() {
						Toast.makeText(LaunchActivity.this, "Disconnected!",
								Toast.LENGTH_LONG).show();
					}
				});
			}
		});

		// Hier wird der Name des Clients gesetzt
		name = CLIENT_NAME;

		wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

		if (!checkWifi())
			Toast.makeText(this, "Bitte WLAN einschalten!", Toast.LENGTH_LONG)
					.show();

		editIP = (EditText) findViewById(R.id.editTextIP);
		bConnect = (Button) findViewById(R.id.bConnect);

		bConnect.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (!checkWifi())
					Toast.makeText(LaunchActivity.this,
							"Bitte WLAN einschalten!", Toast.LENGTH_LONG)
							.show();
				else {
					ip = editIP.getText().toString().trim();
					if (ip == null || ip.length() == 0)
						Toast.makeText(LaunchActivity.this,
								"Bitte gueltige IP-Adresse eingeben!",
								Toast.LENGTH_LONG).show();
					else {
						try {
							final InetAddress host = InetAddress.getByName(ip);
							if (host != null) {
								new Thread("Connect") {
									public void run() {
										try {
											client.connect(5000, host,
													Network.port);
										} catch (IOException e) {
											Log.e("Host", e.toString());
											runOnUiThread(new Runnable() {

												@Override
												public void run() {
													Toast.makeText(
															LaunchActivity.this,
															"Es konnte keine Verbindung zum Server aufgebaut werden!",
															Toast.LENGTH_LONG)
															.show();
												}
											});
										}
									}
								}.start();
								Intent myIntent = new Intent(
										LaunchActivity.this,
										ControlActivity.class);
								LaunchActivity.this.startActivity(myIntent);
							} else
								Toast.makeText(LaunchActivity.this,
										"Bitte gueltige IP-Adresse eingeben!",
										Toast.LENGTH_LONG).show();
						} catch (UnknownHostException e) {
							Log.e("Host", e.toString());
							Toast.makeText(LaunchActivity.this,
									"Bitte gueltige IP-Adresse eingeben!",
									Toast.LENGTH_LONG).show();
						}
					}
				}
			}
		});
	}

	/**
	 * Die Methode ueberprueft, ob auf dem Geraet Wi-Fi aktiviert ist oder nicht
	 * 
	 * @return true, wenn Wi-Fi aktiviert ist false, sonst
	 */
	private boolean checkWifi() {
		if (wifiManager.isWifiEnabled())
			return true;
		else
			return false;
	}

}
